This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

library(tidyverse)
── Attaching core tidyverse packages ────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.1
✔ purrr     1.0.2     ── Conflicts ──────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors

Visualizations for 2025 QCBS Poster Symposium.

Map with associated environmental data:

australia_map <- map_data("world", region = "Australia")
ggplot() +
  geom_polygon(data = australia_map, aes(x = long, y = lat, group = group), 
               fill = NA, color = "black", alpha = 0.5) +  # Transparent inside
  geom_point(data = aus_data, aes(x = long_deg, y = lat_deg), size = 4) +
  theme_void() +
  theme(
    panel.background = element_rect(fill = "transparent", colour = NA),
    plot.background = element_rect(fill = "transparent", colour = NA)
  )

#looks squished but will work

Species observations on map:

#species frequency table with associated location for plotting
australia_map <- map_data("world", region = "Australia")

species_geo <- tibble(
  species_binom = aus_data$species_binom,
  lat = aus_data$lat_deg,
  long = aus_data$long_deg) %>%
  group_by(species_binom) %>%
  mutate(frequency = n()) %>%
  ungroup() %>%
  select(species_binom, lat, long, frequency) %>%
  distinct() %>% #to remove duplicate rows
  arrange(desc(frequency))

ggplot() +
  geom_polygon(data = australia_map, aes(x = long, y = lat, group = group), 
               fill = "white", color = "black") +
  geom_point(data = subset(species_geo, frequency > 50), 
             aes(x = long, y = lat, color = species_binom), size = 2) +
  scale_color_discrete() +
  theme_classic()


ggplot() + australia_map +
  geom_point(data = subset(species_geo, frequency > 50), mapping = aes(x = long, y = lat,
             color = species_binom), size = 2) +
  scale_color_discrete() +
  theme_classic()
Warning: Incompatible methods ("+.gg", "Ops.data.frame") for "+"Error in ggplot() + australia_map : 
  non-numeric argument to binary operator

Leaf nutrient concentration by myc_type and fixation:

leaf_concentration_data <- aus_data %>%
  select(Unique_ID, woodiness, reclass_life_history, putative_BNF, myc_type,
         leaf_N_per_dry_mass, leaf_P_per_dry_mass, leaf_C_per_dry_mass,
         NP_ratio, CN_ratio, CP_ratio,
         ln_NP_ratio, ln_CN_ratio, ln_CP_ratio) %>%
  pivot_longer(cols = c(leaf_N_per_dry_mass, leaf_P_per_dry_mass, leaf_C_per_dry_mass,
                        NP_ratio, CN_ratio, CP_ratio,
                        ln_NP_ratio, ln_CN_ratio, ln_CP_ratio),
               names_to = "nutrient",
               values_to = "concentration") %>%
  mutate(nutrient = factor(case_when(
    nutrient == "leaf_N_per_dry_mass" ~ "N",
    nutrient == "leaf_P_per_dry_mass" ~ "P",
    nutrient == "leaf_C_per_dry_mass" ~ "C",
    nutrient == "NP_ratio" ~ "N:P Ratio", 
    nutrient == "CN_ratio" ~ "C:N Ratio",
    nutrient == "CP_ratio" ~ "C:P Ratio", 
    nutrient == "ln_NP_ratio" ~ "Logged N:P Ratio",
    nutrient == "ln_CN_ratio" ~ "Logged C:N Ratio",
    nutrient == "ln_CP_ratio" ~ "Logged C:P Ratio",
  )))

#ggplot(leaf_concentration_data, aes(x = factor(woodiness), y = concentration, fill = nutrient)) + 
 # geom_boxplot() +
  #scale_fill_manual(values = c("N" = "pink", "P" = "lightyellow", "C" = "lightgreen")) +
 # facet_wrap(~woodiness, scales = "free") +
  #theme_classic()

ggplot(subset(leaf_concentration_data, nutrient == "N"), 
       aes(x = factor(myc_type), y = concentration)) +
  geom_boxplot(fill = "pink") +
  #labs(x = "Woodiness", y = "Concentration (per dry mass)", 
      # title = "Leaf N by Woodiness")
  theme_classic()


ggplot(subset(leaf_concentration_data, nutrient == "Logged N:P Ratio"), 
       aes(x = factor(reclass_life_history), y = concentration)) +
  geom_boxplot(fill = "lightgrey") +
  #labs(x = "Woodiness", y = "Concentration (per dry mass)", 
      # title = "Leaf N by Woodiness")
  theme_classic()

NA
NA

Leaf nutrient concentration by species dot plot:

pruned <- prune_ausdata(aus_data, 62)
complete <- aus_data %>% mutate(species_binom = "All Species")
combined <- bind_rows(pruned, complete)

# Capitalize species_binom names
capitalize_species <- function(name) {
  name_parts <- strsplit(name, "_")[[1]]
  paste(toupper(substring(name_parts, 1, 1)), substring(name_parts, 2), sep = "", collapse = " ")
}

# Apply the capitalization function to species names in pruned dataframe
pruned <- pruned %>%
  mutate(species_binom = sapply(species_binom, capitalize_species))

# Correctly set the factor levels with "All Species" first
combined <- bind_rows(complete, pruned)
combined$species_binom <- factor(combined$species_binom,
                                 levels = c("All Species", unique(pruned$species_binom)))
#Explicitly define factor levels with "All Species" first


# Plot with adjustments
ggplot(combined, aes(x = species_binom, y = leaf_N_per_dry_mass)) +
  geom_jitter(width = 0.2, height = 0, size = 1.5, alpha = 0.6, color = "black") +
  theme_classic() +
  labs(title = "",
       y = "Leaf Nitrogen Concentration (per dry mass)",
       x = NULL) +
  theme(
    axis.text.x = element_text(angle = 50, hjust = 1, size = 20, color = "black"),
    axis.text.y = element_text(size = 14, color = "black"),
    axis.title.y = element_text(size = 20, color = "black", margin = margin(r = 20)),
    plot.title = element_text(size = 16, color = "black")
    )

Species-level lin. reg:

pruned <- prune_ausdata(aus_data, 62)

ggplot(pruned, aes(x = SN_total_0_30, y = (leaf_N_per_dry_mass), color = species_binom)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE)

  theme_classic() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
List of 136
 $ line                            :List of 6
  ..$ colour       : chr "black"
  ..$ linewidth    : num 0.5
  ..$ linetype     : num 1
  ..$ lineend      : chr "butt"
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ rect                            :List of 5
  ..$ fill         : chr "white"
  ..$ colour       : chr "black"
  ..$ linewidth    : num 0.5
  ..$ linetype     : num 1
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ text                            :List of 11
  ..$ family       : chr ""
  ..$ face         : chr "plain"
  ..$ colour       : chr "black"
  ..$ size         : num 11
  ..$ hjust        : num 0.5
  ..$ vjust        : num 0.5
  ..$ angle        : num 0
  ..$ lineheight   : num 0.9
  ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ title                           : NULL
 $ aspect.ratio                    : NULL
 $ axis.title                      : NULL
 $ axis.title.x                    :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.x.top                :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 0
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.x.bottom             : NULL
 $ axis.title.y                    :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : num 90
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.title.y.left               : NULL
 $ axis.title.y.right              :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 1
  ..$ angle        : num -90
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text                       :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : chr "grey30"
  ..$ size         : 'rel' num 0.8
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x                     :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 1
  ..$ vjust        : num 1
  ..$ angle        : num 45
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi FALSE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x.top                 :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : NULL
  ..$ vjust        : num 0
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.x.bottom              : NULL
 $ axis.text.y                     :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 1
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.y.left                : NULL
 $ axis.text.y.right               :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.text.theta                 : NULL
 $ axis.text.r                     :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0.5
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 2.2points
  .. ..- attr(*, "unit")= int 8
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ axis.ticks                      :List of 6
  ..$ colour       : chr "grey20"
  ..$ linewidth    : NULL
  ..$ linetype     : NULL
  ..$ lineend      : NULL
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ axis.ticks.x                    : NULL
 $ axis.ticks.x.top                : NULL
 $ axis.ticks.x.bottom             : NULL
 $ axis.ticks.y                    : NULL
 $ axis.ticks.y.left               : NULL
 $ axis.ticks.y.right              : NULL
 $ axis.ticks.theta                : NULL
 $ axis.ticks.r                    : NULL
 $ axis.minor.ticks.x.top          : NULL
 $ axis.minor.ticks.x.bottom       : NULL
 $ axis.minor.ticks.y.left         : NULL
 $ axis.minor.ticks.y.right        : NULL
 $ axis.minor.ticks.theta          : NULL
 $ axis.minor.ticks.r              : NULL
 $ axis.ticks.length               : 'simpleUnit' num 2.75points
  ..- attr(*, "unit")= int 8
 $ axis.ticks.length.x             : NULL
 $ axis.ticks.length.x.top         : NULL
 $ axis.ticks.length.x.bottom      : NULL
 $ axis.ticks.length.y             : NULL
 $ axis.ticks.length.y.left        : NULL
 $ axis.ticks.length.y.right       : NULL
 $ axis.ticks.length.theta         : NULL
 $ axis.ticks.length.r             : NULL
 $ axis.minor.ticks.length         : 'rel' num 0.75
 $ axis.minor.ticks.length.x       : NULL
 $ axis.minor.ticks.length.x.top   : NULL
 $ axis.minor.ticks.length.x.bottom: NULL
 $ axis.minor.ticks.length.y       : NULL
 $ axis.minor.ticks.length.y.left  : NULL
 $ axis.minor.ticks.length.y.right : NULL
 $ axis.minor.ticks.length.theta   : NULL
 $ axis.minor.ticks.length.r       : NULL
 $ axis.line                       :List of 6
  ..$ colour       : chr "black"
  ..$ linewidth    : 'rel' num 1
  ..$ linetype     : NULL
  ..$ lineend      : NULL
  ..$ arrow        : logi FALSE
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_line" "element"
 $ axis.line.x                     : NULL
 $ axis.line.x.top                 : NULL
 $ axis.line.x.bottom              : NULL
 $ axis.line.y                     : NULL
 $ axis.line.y.left                : NULL
 $ axis.line.y.right               : NULL
 $ axis.line.theta                 : NULL
 $ axis.line.r                     : NULL
 $ legend.background               :List of 5
  ..$ fill         : NULL
  ..$ colour       : logi NA
  ..$ linewidth    : NULL
  ..$ linetype     : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_rect" "element"
 $ legend.margin                   : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
  ..- attr(*, "unit")= int 8
 $ legend.spacing                  : 'simpleUnit' num 11points
  ..- attr(*, "unit")= int 8
 $ legend.spacing.x                : NULL
 $ legend.spacing.y                : NULL
 $ legend.key                      : NULL
 $ legend.key.size                 : 'simpleUnit' num 1.2lines
  ..- attr(*, "unit")= int 3
 $ legend.key.height               : NULL
 $ legend.key.width                : NULL
 $ legend.key.spacing              : 'simpleUnit' num 5.5points
  ..- attr(*, "unit")= int 8
 $ legend.key.spacing.x            : NULL
 $ legend.key.spacing.y            : NULL
 $ legend.frame                    : NULL
 $ legend.ticks                    : NULL
 $ legend.ticks.length             : 'rel' num 0.2
 $ legend.axis.line                : NULL
 $ legend.text                     :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : 'rel' num 0.8
  ..$ hjust        : NULL
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ legend.text.position            : NULL
 $ legend.title                    :List of 11
  ..$ family       : NULL
  ..$ face         : NULL
  ..$ colour       : NULL
  ..$ size         : NULL
  ..$ hjust        : num 0
  ..$ vjust        : NULL
  ..$ angle        : NULL
  ..$ lineheight   : NULL
  ..$ margin       : NULL
  ..$ debug        : NULL
  ..$ inherit.blank: logi TRUE
  ..- attr(*, "class")= chr [1:2] "element_text" "element"
 $ legend.title.position           : NULL
 $ legend.position                 : chr "right"
 $ legend.position.inside          : NULL
 $ legend.direction                : NULL
 $ legend.byrow                    : NULL
 $ legend.justification            : chr "center"
 $ legend.justification.top        : NULL
 $ legend.justification.bottom     : NULL
 $ legend.justification.left       : NULL
 $ legend.justification.right      : NULL
 $ legend.justification.inside     : NULL
 $ legend.location                 : NULL
 $ legend.box                      : NULL
 $ legend.box.just                 : NULL
 $ legend.box.margin               : 'margin' num [1:4] 0cm 0cm 0cm 0cm
  ..- attr(*, "unit")= int 1
 $ legend.box.background           : list()
  ..- attr(*, "class")= chr [1:2] "element_blank" "element"
 $ legend.box.spacing              : 'simpleUnit' num 11points
  ..- attr(*, "unit")= int 8
  [list output truncated]
 - attr(*, "class")= chr [1:2] "theme" "gg"
 - attr(*, "complete")= logi TRUE
 - attr(*, "validate")= logi TRUE

Missing data densities:

na_data <- aus_data %>%
  mutate(across(c(leaf_P_per_dry_mass,leaf_C_per_dry_mass,
                  NP_ratio, CN_ratio, CP_ratio), as.character)) %>% 
  replace_na(list(leaf_N_per_dry_mass= "NA", leaf_P_per_dry_mass = "NA",
                  leaf_C_per_dry_mass = "NA",NP_ratio = "NA",
                  CN_ratio = "NA", CP_ratio = "NA"))

na_data <- na_data %>%
  filter(leaf_P_per_dry_mass == "NA" | leaf_C_per_dry_mass == "NA" |
           NP_ratio == "NA" | CN_ratio == "NA" | CP_ratio == "NA")

#specify colors
color_palette <- c("NA rows" = "lightgray", "All data" = "lightgreen")

#density plot of missing leaf concentration data
#using (complete) leaf N to compare rows with NAs for P and C
ggplot() +
  geom_density(data = aus_data,
               mapping = aes(x = leaf_N_per_dry_mass,
                             fill = "All data", alpha = 0.5)) +
  geom_density(data = na_data,
               mapping = aes(x = leaf_N_per_dry_mass,
                             fill = "NA rows", alpha = 0.5)) +
  labs(title = "Leaf N observations with Missing Leaf P and/or Leaf C",
       x = "leaf N", y = "Density") +
  theme_classic() +
  scale_fill_manual(values = color_palette, name = " ") +
  theme(legend.position = c(0.83, 0.86))


#missing env. coverage
ggplot() +
  geom_density(data = aus_data,
               mapping = aes(x = SN_total_0_30,
                             fill = "All data", alpha = 0.5)) +
  geom_density(data = na_data,
               mapping = aes(x = SN_total_0_30,
                             fill = "NA rows", alpha = 0.5)) +
  labs(title = "Observations with Missing Leaf P and/or Leaf C",
       y = "Density") +
  theme_classic() +
  scale_fill_manual(values = color_palette, name = " ") +
  theme(legend.position = c(0.83, 0.86))

Phylogenetic tree:

library(ggtree)
library(tidytree)
library(treeio)
setwd("/Users/sofiaquijada/Library/Mobile Documents/com~apple~CloudDocs/McGill/2024 Soper Lab/AusStoich-Collab")
Warning: The working directory was changed to /Users/sofiaquijada/Library/Mobile Documents/com~apple~CloudDocs/McGill/2024 Soper Lab/AusStoich-Collab inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
#works but only if all run at once
ausdata_all_pos_sp_tree <- read.tree("Inputs/Trees/ausdata_all_pos_sp.tre")
austraits_all_pos_sp_df <- read_csv('Inputs/all_pos_austraits_LCVP_sp.csv')
Rows: 829 Columns: 5── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): species, genus, family
lgl (2): species.relative, genus.relative
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
all_pos_sp_data <- aus_data[aus_data$species_binom %in%
                   austraits_all_pos_sp_df$species, ]

all_pos_sp_data <- add_CV_columns(select_relevant_columns(all_pos_sp_data))

avg_all_pos_sp_data <- average_nutrient_data(all_pos_sp_data)

#horizontal base
all_pos_sp_plot <- ggtree(ausdata_all_pos_sp_tree) + geom_tiplab(size = 0.5)

#most basic, no coloring, horizontal bar plot
all_pos_sp_plot + geom_facet(
  panel = 'Trait',
  data = avg_all_pos_sp_data,
  geom = geom_col,
  mapping = aes(x = avg_leaf_N),
  orientation = "y") +
  ggtitle("") +
  theme(plot.title = element_text(size = 20))


names(avg_all_pos_sp_data)[1] <- "label"
attemptree <- full_join(as.treedata(ausdata_all_pos_sp_tree), avg_all_pos_sp_data, by = "label")

#mess with line thickness, and very small tip labels to manually write over later
#get label in the middle
ggtree(attemptree, aes(color = avg_leaf_N), layout = "circular") +
  scale_color_continuous(low = "#6ad1f3", high = "#ee6b00") +
  geom_tiplab(size = 0.5)

LS0tCnRpdGxlOiAiUG9zdGVyIFZpc3VhbHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIAoKVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkNtZCtTaGlmdCtFbnRlciouIAoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkNtZCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLiAKClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpgYGAKClZpc3VhbGl6YXRpb25zIGZvciAyMDI1IFFDQlMgUG9zdGVyIFN5bXBvc2l1bS4KCk1hcCB3aXRoIGFzc29jaWF0ZWQgZW52aXJvbm1lbnRhbCBkYXRhOgpgYGB7cn0KYXVzdHJhbGlhX21hcCA8LSBtYXBfZGF0YSgid29ybGQiLCByZWdpb24gPSAiQXVzdHJhbGlhIikKZ2dwbG90KCkgKwogIGdlb21fcG9seWdvbihkYXRhID0gYXVzdHJhbGlhX21hcCwgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwgCiAgICAgICAgICAgICAgIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuNSkgKyAgIyBUcmFuc3BhcmVudCBpbnNpZGUKICBnZW9tX3BvaW50KGRhdGEgPSBhdXNfZGF0YSwgYWVzKHggPSBsb25nX2RlZywgeSA9IGxhdF9kZWcpLCBzaXplID0gNCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUoCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBjb2xvdXIgPSBOQSksCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9IE5BKQogICkKI2xvb2tzIHNxdWlzaGVkIGJ1dCB3aWxsIHdvcmsKYGBgCgpTcGVjaWVzIG9ic2VydmF0aW9ucyBvbiBtYXA6CmBgYHtyfQojc3BlY2llcyBmcmVxdWVuY3kgdGFibGUgd2l0aCBhc3NvY2lhdGVkIGxvY2F0aW9uIGZvciBwbG90dGluZwphdXN0cmFsaWFfbWFwIDwtIG1hcF9kYXRhKCJ3b3JsZCIsIHJlZ2lvbiA9ICJBdXN0cmFsaWEiKQoKc3BlY2llc19nZW8gPC0gdGliYmxlKAogIHNwZWNpZXNfYmlub20gPSBhdXNfZGF0YSRzcGVjaWVzX2Jpbm9tLAogIGxhdCA9IGF1c19kYXRhJGxhdF9kZWcsCiAgbG9uZyA9IGF1c19kYXRhJGxvbmdfZGVnKSAlPiUKICBncm91cF9ieShzcGVjaWVzX2Jpbm9tKSAlPiUKICBtdXRhdGUoZnJlcXVlbmN5ID0gbigpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KHNwZWNpZXNfYmlub20sIGxhdCwgbG9uZywgZnJlcXVlbmN5KSAlPiUKICBkaXN0aW5jdCgpICU+JSAjdG8gcmVtb3ZlIGR1cGxpY2F0ZSByb3dzCiAgYXJyYW5nZShkZXNjKGZyZXF1ZW5jeSkpCgpnZ3Bsb3QoKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSBhdXN0cmFsaWFfbWFwLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLCAKICAgICAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldChzcGVjaWVzX2dlbywgZnJlcXVlbmN5ID4gNTApLCAKICAgICAgICAgICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgY29sb3IgPSBzcGVjaWVzX2Jpbm9tKSwgc2l6ZSA9IDIpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZSgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgpMZWFmIG51dHJpZW50IGNvbmNlbnRyYXRpb24gYnkgbXljX3R5cGUgYW5kIGZpeGF0aW9uOgpgYGB7cn0KbGVhZl9jb25jZW50cmF0aW9uX2RhdGEgPC0gYXVzX2RhdGEgJT4lCiAgc2VsZWN0KFVuaXF1ZV9JRCwgd29vZGluZXNzLCByZWNsYXNzX2xpZmVfaGlzdG9yeSwgcHV0YXRpdmVfQk5GLCBteWNfdHlwZSwKICAgICAgICAgbGVhZl9OX3Blcl9kcnlfbWFzcywgbGVhZl9QX3Blcl9kcnlfbWFzcywgbGVhZl9DX3Blcl9kcnlfbWFzcywKICAgICAgICAgTlBfcmF0aW8sIENOX3JhdGlvLCBDUF9yYXRpbywKICAgICAgICAgbG5fTlBfcmF0aW8sIGxuX0NOX3JhdGlvLCBsbl9DUF9yYXRpbykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGxlYWZfTl9wZXJfZHJ5X21hc3MsIGxlYWZfUF9wZXJfZHJ5X21hc3MsIGxlYWZfQ19wZXJfZHJ5X21hc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIE5QX3JhdGlvLCBDTl9yYXRpbywgQ1BfcmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgIGxuX05QX3JhdGlvLCBsbl9DTl9yYXRpbywgbG5fQ1BfcmF0aW8pLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJudXRyaWVudCIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJjb25jZW50cmF0aW9uIikgJT4lCiAgbXV0YXRlKG51dHJpZW50ID0gZmFjdG9yKGNhc2Vfd2hlbigKICAgIG51dHJpZW50ID09ICJsZWFmX05fcGVyX2RyeV9tYXNzIiB+ICJOIiwKICAgIG51dHJpZW50ID09ICJsZWFmX1BfcGVyX2RyeV9tYXNzIiB+ICJQIiwKICAgIG51dHJpZW50ID09ICJsZWFmX0NfcGVyX2RyeV9tYXNzIiB+ICJDIiwKICAgIG51dHJpZW50ID09ICJOUF9yYXRpbyIgfiAiTjpQIFJhdGlvIiwgCiAgICBudXRyaWVudCA9PSAiQ05fcmF0aW8iIH4gIkM6TiBSYXRpbyIsCiAgICBudXRyaWVudCA9PSAiQ1BfcmF0aW8iIH4gIkM6UCBSYXRpbyIsIAogICAgbnV0cmllbnQgPT0gImxuX05QX3JhdGlvIiB+ICJMb2dnZWQgTjpQIFJhdGlvIiwKICAgIG51dHJpZW50ID09ICJsbl9DTl9yYXRpbyIgfiAiTG9nZ2VkIEM6TiBSYXRpbyIsCiAgICBudXRyaWVudCA9PSAibG5fQ1BfcmF0aW8iIH4gIkxvZ2dlZCBDOlAgUmF0aW8iLAogICkpKQoKI2dncGxvdChsZWFmX2NvbmNlbnRyYXRpb25fZGF0YSwgYWVzKHggPSBmYWN0b3Iod29vZGluZXNzKSwgeSA9IGNvbmNlbnRyYXRpb24sIGZpbGwgPSBudXRyaWVudCkpICsgCiAjIGdlb21fYm94cGxvdCgpICsKICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTiIgPSAicGluayIsICJQIiA9ICJsaWdodHllbGxvdyIsICJDIiA9ICJsaWdodGdyZWVuIikpICsKICMgZmFjZXRfd3JhcCh+d29vZGluZXNzLCBzY2FsZXMgPSAiZnJlZSIpICsKICAjdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3Qoc3Vic2V0KGxlYWZfY29uY2VudHJhdGlvbl9kYXRhLCBudXRyaWVudCA9PSAiTiIpLCAKICAgICAgIGFlcyh4ID0gZmFjdG9yKG15Y190eXBlKSwgeSA9IGNvbmNlbnRyYXRpb24pKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAicGluayIpICsKICAjbGFicyh4ID0gIldvb2RpbmVzcyIsIHkgPSAiQ29uY2VudHJhdGlvbiAocGVyIGRyeSBtYXNzKSIsIAogICAgICAjIHRpdGxlID0gIkxlYWYgTiBieSBXb29kaW5lc3MiKQogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KHN1YnNldChsZWFmX2NvbmNlbnRyYXRpb25fZGF0YSwgbnV0cmllbnQgPT0gIkxvZ2dlZCBOOlAgUmF0aW8iKSwgCiAgICAgICBhZXMoeCA9IGZhY3RvcihyZWNsYXNzX2xpZmVfaGlzdG9yeSksIHkgPSBjb25jZW50cmF0aW9uKSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Z3JleSIpICsKICAjbGFicyh4ID0gIldvb2RpbmVzcyIsIHkgPSAiQ29uY2VudHJhdGlvbiAocGVyIGRyeSBtYXNzKSIsIAogICAgICAjIHRpdGxlID0gIkxlYWYgTiBieSBXb29kaW5lc3MiKQogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCkxlYWYgbnV0cmllbnQgY29uY2VudHJhdGlvbiBieSBzcGVjaWVzIGRvdCBwbG90OgpgYGB7cn0KcHJ1bmVkIDwtIHBydW5lX2F1c2RhdGEoYXVzX2RhdGEsIDYyKQpjb21wbGV0ZSA8LSBhdXNfZGF0YSAlPiUgbXV0YXRlKHNwZWNpZXNfYmlub20gPSAiQWxsIFNwZWNpZXMiKQpjb21iaW5lZCA8LSBiaW5kX3Jvd3MocHJ1bmVkLCBjb21wbGV0ZSkKCiMgQ2FwaXRhbGl6ZSBzcGVjaWVzX2Jpbm9tIG5hbWVzCmNhcGl0YWxpemVfc3BlY2llcyA8LSBmdW5jdGlvbihuYW1lKSB7CiAgbmFtZV9wYXJ0cyA8LSBzdHJzcGxpdChuYW1lLCAiXyIpW1sxXV0KICBwYXN0ZSh0b3VwcGVyKHN1YnN0cmluZyhuYW1lX3BhcnRzLCAxLCAxKSksIHN1YnN0cmluZyhuYW1lX3BhcnRzLCAyKSwgc2VwID0gIiIsIGNvbGxhcHNlID0gIiAiKQp9CgojIEFwcGx5IHRoZSBjYXBpdGFsaXphdGlvbiBmdW5jdGlvbiB0byBzcGVjaWVzIG5hbWVzIGluIHBydW5lZCBkYXRhZnJhbWUKcHJ1bmVkIDwtIHBydW5lZCAlPiUKICBtdXRhdGUoc3BlY2llc19iaW5vbSA9IHNhcHBseShzcGVjaWVzX2Jpbm9tLCBjYXBpdGFsaXplX3NwZWNpZXMpKQoKIyBDb3JyZWN0bHkgc2V0IHRoZSBmYWN0b3IgbGV2ZWxzIHdpdGggIkFsbCBTcGVjaWVzIiBmaXJzdApjb21iaW5lZCA8LSBiaW5kX3Jvd3MoY29tcGxldGUsIHBydW5lZCkKY29tYmluZWQkc3BlY2llc19iaW5vbSA8LSBmYWN0b3IoY29tYmluZWQkc3BlY2llc19iaW5vbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQWxsIFNwZWNpZXMiLCB1bmlxdWUocHJ1bmVkJHNwZWNpZXNfYmlub20pKSkKIyBFeHBsaWNpdGx5IGRlZmluZSBmYWN0b3IgbGV2ZWxzIHdpdGggIkFsbCBTcGVjaWVzIiBmaXJzdAoKCiMgUGxvdCB3aXRoIGFkanVzdG1lbnRzCmdncGxvdChjb21iaW5lZCwgYWVzKHggPSBzcGVjaWVzX2Jpbm9tLCB5ID0gbGVhZl9OX3Blcl9kcnlfbWFzcykpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMiwgaGVpZ2h0ID0gMCwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwLjYsIGNvbG9yID0gImJsYWNrIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh0aXRsZSA9ICIiLAogICAgICAgeSA9ICJMZWFmIE5pdHJvZ2VuIENvbmNlbnRyYXRpb24gKHBlciBkcnkgbWFzcykiLAogICAgICAgeCA9IE5VTEwpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNTAsIGhqdXN0ID0gMSwgc2l6ZSA9IDIwLCBjb2xvciA9ICJibGFjayIpLAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgY29sb3IgPSAiYmxhY2siLCBtYXJnaW4gPSBtYXJnaW4ociA9IDIwKSksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgY29sb3IgPSAiYmxhY2siKQogICAgKQpgYGAKClNwZWNpZXMtbGV2ZWwgbGluLiByZWc6CmBgYHtyfQpwcnVuZWQgPC0gcHJ1bmVfYXVzZGF0YShhdXNfZGF0YSwgNjIpCgpnZ3Bsb3QocHJ1bmVkLCBhZXMoeCA9IFNOX3RvdGFsXzBfMzAsIHkgPSAobGVhZl9OX3Blcl9kcnlfbWFzcyksIGNvbG9yID0gc3BlY2llc19iaW5vbSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC42KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmBgYAoKTWlzc2luZyBkYXRhIGRlbnNpdGllczoKYGBge3J9Cm5hX2RhdGEgPC0gYXVzX2RhdGEgJT4lCiAgbXV0YXRlKGFjcm9zcyhjKGxlYWZfUF9wZXJfZHJ5X21hc3MsbGVhZl9DX3Blcl9kcnlfbWFzcywKICAgICAgICAgICAgICAgICAgTlBfcmF0aW8sIENOX3JhdGlvLCBDUF9yYXRpbyksIGFzLmNoYXJhY3RlcikpICU+JSAKICByZXBsYWNlX25hKGxpc3QobGVhZl9OX3Blcl9kcnlfbWFzcz0gIk5BIiwgbGVhZl9QX3Blcl9kcnlfbWFzcyA9ICJOQSIsCiAgICAgICAgICAgICAgICAgIGxlYWZfQ19wZXJfZHJ5X21hc3MgPSAiTkEiLE5QX3JhdGlvID0gIk5BIiwKICAgICAgICAgICAgICAgICAgQ05fcmF0aW8gPSAiTkEiLCBDUF9yYXRpbyA9ICJOQSIpKQoKbmFfZGF0YSA8LSBuYV9kYXRhICU+JQogIGZpbHRlcihsZWFmX1BfcGVyX2RyeV9tYXNzID09ICJOQSIgfCBsZWFmX0NfcGVyX2RyeV9tYXNzID09ICJOQSIgfAogICAgICAgICAgIE5QX3JhdGlvID09ICJOQSIgfCBDTl9yYXRpbyA9PSAiTkEiIHwgQ1BfcmF0aW8gPT0gIk5BIikKCiNzcGVjaWZ5IGNvbG9ycwpjb2xvcl9wYWxldHRlIDwtIGMoIk5BIHJvd3MiID0gImxpZ2h0Z3JheSIsICJBbGwgZGF0YSIgPSAibGlnaHRncmVlbiIpCgojZGVuc2l0eSBwbG90IG9mIG1pc3NpbmcgbGVhZiBjb25jZW50cmF0aW9uIGRhdGEKI3VzaW5nIChjb21wbGV0ZSkgbGVhZiBOIHRvIGNvbXBhcmUgcm93cyB3aXRoIE5BcyBmb3IgUCBhbmQgQwpnZ3Bsb3QoKSArCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBhdXNfZGF0YSwKICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbGVhZl9OX3Blcl9kcnlfbWFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkFsbCBkYXRhIiwgYWxwaGEgPSAwLjUpKSArCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBuYV9kYXRhLAogICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBsZWFmX05fcGVyX2RyeV9tYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiTkEgcm93cyIsIGFscGhhID0gMC41KSkgKwogIGxhYnModGl0bGUgPSAiTGVhZiBOIG9ic2VydmF0aW9ucyB3aXRoIE1pc3NpbmcgTGVhZiBQIGFuZC9vciBMZWFmIEMiLAogICAgICAgeCA9ICJsZWFmIE4iLCB5ID0gIkRlbnNpdHkiKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9wYWxldHRlLCBuYW1lID0gIiAiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjgzLCAwLjg2KSkKCiNtaXNzaW5nIGVudi4gY292ZXJhZ2UKZ2dwbG90KCkgKwogIGdlb21fZGVuc2l0eShkYXRhID0gYXVzX2RhdGEsCiAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IFNOX3RvdGFsXzBfMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJBbGwgZGF0YSIsIGFscGhhID0gMC41KSkgKwogIGdlb21fZGVuc2l0eShkYXRhID0gbmFfZGF0YSwKICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gU05fdG90YWxfMF8zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIk5BIHJvd3MiLCBhbHBoYSA9IDAuNSkpICsKICBsYWJzKHRpdGxlID0gIk9ic2VydmF0aW9ucyB3aXRoIE1pc3NpbmcgTGVhZiBQIGFuZC9vciBMZWFmIEMiLAogICAgICAgeSA9ICJEZW5zaXR5IikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfcGFsZXR0ZSwgbmFtZSA9ICIgIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC44MywgMC44NikpCmBgYAoKUGh5bG9nZW5ldGljIHRyZWU6CmBgYHtyfQpsaWJyYXJ5KGdndHJlZSkKbGlicmFyeSh0aWR5dHJlZSkKbGlicmFyeSh0cmVlaW8pCnNldHdkKCIvVXNlcnMvc29maWFxdWlqYWRhL0xpYnJhcnkvTW9iaWxlIERvY3VtZW50cy9jb21+YXBwbGV+Q2xvdWREb2NzL01jR2lsbC8yMDI0IFNvcGVyIExhYi9BdXNTdG9pY2gtQ29sbGFiIikKCiN3b3JrcyBidXQgb25seSBpZiBhbGwgcnVuIGF0IG9uY2UKYXVzZGF0YV9hbGxfcG9zX3NwX3RyZWUgPC0gcmVhZC50cmVlKCJJbnB1dHMvVHJlZXMvYXVzZGF0YV9hbGxfcG9zX3NwLnRyZSIpCmF1c3RyYWl0c19hbGxfcG9zX3NwX2RmIDwtIHJlYWRfY3N2KCdJbnB1dHMvYWxsX3Bvc19hdXN0cmFpdHNfTENWUF9zcC5jc3YnKQoKYWxsX3Bvc19zcF9kYXRhIDwtIGF1c19kYXRhW2F1c19kYXRhJHNwZWNpZXNfYmlub20gJWluJQogICAgICAgICAgICAgICAgICAgYXVzdHJhaXRzX2FsbF9wb3Nfc3BfZGYkc3BlY2llcywgXQoKYWxsX3Bvc19zcF9kYXRhIDwtIGFkZF9DVl9jb2x1bW5zKHNlbGVjdF9yZWxldmFudF9jb2x1bW5zKGFsbF9wb3Nfc3BfZGF0YSkpCgphdmdfYWxsX3Bvc19zcF9kYXRhIDwtIGF2ZXJhZ2VfbnV0cmllbnRfZGF0YShhbGxfcG9zX3NwX2RhdGEpCgojaG9yaXpvbnRhbCBiYXNlCmFsbF9wb3Nfc3BfcGxvdCA8LSBnZ3RyZWUoYXVzZGF0YV9hbGxfcG9zX3NwX3RyZWUpICsgZ2VvbV90aXBsYWIoc2l6ZSA9IDAuNSkKCiNtb3N0IGJhc2ljLCBubyBjb2xvcmluZywgaG9yaXpvbnRhbCBiYXIgcGxvdAphbGxfcG9zX3NwX3Bsb3QgKyBnZW9tX2ZhY2V0KAogIHBhbmVsID0gJ1RyYWl0JywKICBkYXRhID0gYXZnX2FsbF9wb3Nfc3BfZGF0YSwKICBnZW9tID0gZ2VvbV9jb2wsCiAgbWFwcGluZyA9IGFlcyh4ID0gYXZnX2xlYWZfTiksCiAgb3JpZW50YXRpb24gPSAieSIpICsKICBnZ3RpdGxlKCIiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKQoKbmFtZXMoYXZnX2FsbF9wb3Nfc3BfZGF0YSlbMV0gPC0gImxhYmVsIgphdHRlbXB0cmVlIDwtIGZ1bGxfam9pbihhcy50cmVlZGF0YShhdXNkYXRhX2FsbF9wb3Nfc3BfdHJlZSksIGF2Z19hbGxfcG9zX3NwX2RhdGEsIGJ5ID0gImxhYmVsIikKCiNtZXNzIHdpdGggbGluZSB0aGlja25lc3MsIGFuZCB2ZXJ5IHNtYWxsIHRpcCBsYWJlbHMgdG8gbWFudWFsbHkgd3JpdGUgb3ZlciBsYXRlcgojZ2V0IGxhYmVsIGluIHRoZSBtaWRkbGUKZ2d0cmVlKGF0dGVtcHRyZWUsIGFlcyhjb2xvciA9IGF2Z19sZWFmX04pLCBsYXlvdXQgPSAiY2lyY3VsYXIiKSArCiAgc2NhbGVfY29sb3JfY29udGludW91cyhsb3cgPSAiIzZhZDFmMyIsIGhpZ2ggPSAiI2VlNmIwMCIpICsKICBnZW9tX3RpcGxhYihzaXplID0gMC41KQpgYGA=